#include <iostream>
#include "../../ArbolB+/NodoHoja.h"
#include <../lib/igloo/igloo.h>
#include "../../Archivos/ArchivoDeEstructurasFijas.h"
#include "../../Entidades/Distrito.h"
using namespace std;

using namespace Archivos;
using namespace Entidades;
using namespace std;
using namespace igloo;
using namespace Arboles;

Context(NodoHojaTest)
{

	enum ResultadoOperacionArbol {
			OK, SOBREFLUJO, ACTUALIZADO, SUBFLUJO, FUSION
	};

	Nodo* hoja;

	void SetUp() {

		hoja = new NodoHoja(0,50, 200);
		hoja->setNivel(0);

		RegistroArbol* registroUno = new RegistroArbol("20111007Presidente", 8);
		RegistroArbol* registroDos = new RegistroArbol("20111010Presidente", 7);

		hoja->getRegistros()->push_back(registroUno);
		hoja->getRegistros()->push_back(registroDos);
	}

	void TearDown() {

		delete hoja;

	}

	Spec(calculaTamanioBuffer_returnsTamanioBuffer) {

		unsigned int tamanioRegistro = 30;
		unsigned int infoNodo = 12;
		unsigned int totalOcupadoEsperado = infoNodo + tamanioRegistro * 2;

		unsigned int respuesta = hoja->getTamanioDelBuffer();

		Assert::That(totalOcupadoEsperado, Is().EqualTo(respuesta));
	}

	Spec(insertaResgitro_returnsEstadoModificado) {

		RegistroArbol* registro = new RegistroArbol("20111009Presidente", 19);

		Utils::ResultadoOperacionArbol respuesta = hoja->agregar(registro);

		Assert::That(ACTUALIZADO, Is().EqualTo(respuesta));

	}

	Spec(insertaResgitroClaveRepetida_returnsEstadoModificado) {

		RegistroArbol* registro = new RegistroArbol("20111010Presidente", 66);

		Utils::ResultadoOperacionArbol respuesta = hoja->agregar(registro);

		RegistroArbol* registroHojaRespuesta = hoja->getRegistros()->at(1);

		Assert::That(ACTUALIZADO, Is().EqualTo(respuesta));
		Assert::That(registroHojaRespuesta->getOffsets()->at(1), Is().EqualTo(66));

	}

	Context(NodoHojaTestIntegrcion) {

		//Instancia del archivo a crear.
		ArchivoDeEstructurasFijas* archivoDeDistritos;

		//Path
		string path;

		void SetUp() {

			path = "TestDistrito.bin";
			archivoDeDistritos = new ArchivoDeEstructurasFijas(path, 150);
		}

		void TearDown() {

			delete archivoDeDistritos;
			remove(path.c_str());

		}

		Spec(TestIntegracion) {

			Nodo* nodoHoja = new NodoHoja(0, 50,100);
			nodoHoja->setNivel(0);

			//Agrego un registro nuevo.
			RegistroArbol* registro = new RegistroArbol("20111017Presidente", 99);
			nodoHoja->agregar(registro);

			//Prueba el construirBuffer del nodo.
			archivoDeDistritos->insertar(nodoHoja);

			//Nodo nuevo a hidratar.
			Nodo* nodoLeido = new NodoHoja(0,50,100);

			//Prueba el hidratar del nodo.
			archivoDeDistritos->leer(nodoLeido, 0);

			unsigned int nivelNodoLeido = nodoLeido->getNivel();
			RegistroArbol* RegistroAgregadoNodoLeido = nodoLeido->getRegistros()->at(0);
			unsigned int ultimoOffsetAgregado = RegistroAgregadoNodoLeido->getOffsets()->at(0);

			Assert::That(nivelNodoLeido, Is().EqualTo(nodoHoja->getNivel()));
			Assert::That(ultimoOffsetAgregado, Is().EqualTo(99));
			Assert::That(1, Is().EqualTo(nodoLeido->getRegistros()->size()));

			delete nodoHoja;
			delete nodoLeido;
		}

	};

};

